package com.foodcommunity.service;

import com.foodcommunity.common.Result;
import com.foodcommunity.dto.FoodPostDTO;
import com.foodcommunity.entity.FoodPost;
import java.util.List;
import java.util.Map;

public interface FoodPostService {
    /**
     * 获取热门美食日记
     */
    List<FoodPostDTO> getHotPosts();

    /**
     * 获取更多美食日记
     */
    List<FoodPostDTO> getMorePosts(int page, int size);

    /**
     * 获取用户的美食日记
     */
    List<FoodPost> getUserPosts(Long userId);

    /**
     * 获取美食日记详情
     */
    Result<FoodPost> getPostDetail(Long id);

    /**
     * 创建美食日记
     */
    Result<FoodPost> createPost(FoodPost post);

    /**
     * 更新美食日记
     */
    Result<FoodPost> updatePost(FoodPost post);

    /**
     * 删除美食日记
     */
    Result<Void> deletePost(Long id, Long userId);

    /**
     * 根据ID获取美食日记
     */
    FoodPost getPostById(Long id);

    /**
     * 增加美食日记浏览量
     */
    void incrementViews(Long id);

    /**
     * 点赞美食日记
     * @param id 美食日记ID
     * @param userId 用户ID
     * @return 点赞后的总数
     */
    Result<Integer> likePost(Long id, Long userId);

    /**
     * 获取相关美食日记
     * @param id 当前美食日记ID
     * @param limit 限制数量
     * @return 相关美食日记列表
     */
    List<FoodPostDTO> getRelatedPosts(Long id, int limit);

    /**
     * 根据分类获取美食日记
     * @param category 分类名称
     * @param page 页码
     * @param size 每页大小
     * @param sort 排序方式（latest, popular, comments）
     * @return 美食日记列表
     */
    List<FoodPostDTO> getPostsByCategory(String category, int page, int size, String sort);
    
    /**
     * 根据排序方式获取美食日记
     * @param sort 排序方式（latest, popular, comments）
     * @param page 页码
     * @param size 每页大小
     * @return 美食日记列表
     */
    List<FoodPostDTO> getPostsBySort(String sort, int page, int size);
    
    /**
     * 获取文章总数
     * @param category 分类名称（可选）
     * @return 文章总数
     */
    int getTotalPostsCount(String category);
    
    /**
     * 获取所有美食日记列表（管理员使用）
     * @param page 页码
     * @param size 每页大小
     * @param keyword 搜索关键词（可选）
     * @return 包含美食日记列表和分页信息的Map
     */
    Map<String, Object> getPostList(int page, int size, String keyword);
}